import axios from "axios";
import { ElMessage } from "element-plus";
import "element-plus/theme-chalk/el-message.css";
import { useUserStore } from "@/stores/userStore.js";
import router from "@/router/index.js";
import {useDataPublicStore} from "@/stores/dataPublicStore.ts";

// axios基础封装
const httpInstance= axios.create({
    //这个地址，是后端java接口的地址，不是前端地址，前端地址在nginx中配置，部署或者开发转换地址，前端就修改这里可以了



    // 这行是本地开发用地址
    baseURL:'http://localhost:7082/',


    // 这个是docker部署用地址,就是nginx服务器的地址+端口，注意不是后端Java地址
    //  baseURL:'http://192.168.8.88:7085/api/',
    //   baseURL:'http://[2409:8a55:8282:ce50:a6bb:6dff:fec7:ed12]:7082',

    timeout: 5000,



// `onUploadProgress` 允许为上传处理进度事件
    // 浏览器专属
    // onUploadProgress: function (progressEvent) {
    //         const dataPublicStore=useDataPublicStore();
    //        dataPublicStore.setOnUploadProgress(Math.round((progressEvent.loaded * 100) / (progressEvent.total)));
    //        dataPublicStore.setOnUploadProgress(0);
    // },
// `onDownloadProgress` 允许为下载处理进度事件
    // 浏览器专属
    // onDownloadProgress: function (progressEvent) {
    //         const dataPublicStore=useDataPublicStore();
    //         dataPublicStore.setOnDownloadProgress(Math.round((progressEvent.loaded * 100) / (progressEvent.total)));
    //         dataPublicStore.setOnDownloadProgress(0);
    // },
})

// 拦截器
// axios请求拦截器
httpInstance.interceptors.request.use(
    (config) => {


//      1.从pinia获取Token数据
//        注意，调用userStore要在下面这个位置，如果在外面直接调用，会报错，没有初始化userStore数据
        const userStore=useUserStore();
        // 2.按照后端要求拼接Token数据
        // Axios请求拦截器可以在接口正式发起之前对请求参数做一些事情，通常Token数据会被注入到请求header中，格式按照后端要求
        // 的格式进行拼接处理
        const token = userStore.userInfo;
        if (token) {
            config.headers.token = `${token}`;
        }


        // 请求进度条
        // config.onUploadProgress=(progressEvent)=>{
        //     const dataPublicStore=useDataPublicStore();
        //     dataPublicStore.setOnUploadProgress(Math.round((progressEvent.loaded * 100) / ProgressEvent.total));
        //     console.log(dataPublicStore.onUploadProgress);
        // }
        // config.onDownloadProgress=(progressEvent)=>{
        //     const dataPublicStore=useDataPublicStore();
        //     dataPublicStore.setOnDownloadProgress(Math.round((progressEvent.loaded * 100) / ProgressEvent.total));
        //     console.log(dataPublicStore.onUploadProgress);
        // }


        // 请求前处理
        return config;
    },
    (e) => {
        // 请求错误处理
        return Promise.reject(e);
    }

);
// axios响应式拦截器
httpInstance.interceptors.response.use(
    (res) => {

        // 下载进度条

        res.config.onDownloadProgress=(progressEvent)=>{
            const dataPublicStore=useDataPublicStore();
            dataPublicStore.setOnDownloadProgress(Math.round((progressEvent.loaded * 100) / ProgressEvent.total));

        }

        // 请求成功处理
        return res.data;
    },
    (e) => {
        const userStore=useUserStore();
        // 请求错误处理
        // 返回e的一些提示
        ElMessage({ type: "warning", message: e.response.data.message });

        // 401token失效处理：解决方案--->在axios响应拦截器做统一处理。
        if(e.response.status===401){
            // 1.清除本地数据
            userStore.clearUserInfo().then();
            // 2.跳转登录页
            router.push('/login').then();
        }
        return Promise.reject(e);
    }
);
export default httpInstance